# Appendix G

# Blocking and Deblocking Algorithms

NOTE

This appendix consists of a cross-reference listing generated by the XREF utility from the results of assembly with MAC. The original source file used to generate this listing is available here.

         1                  ;*****************************************************
         2                  ;*                                                   *
         3                  ;*      SECTOR DEBLOCKING ALGORITHMS FOR CP/M 2.0    *
         4                  ;*                                                   *
         5                  ;*****************************************************
         6                  ;
         7                  ;	UTILITY MACRO TO COMPUTE SECTOR MASK
         8                  SMASK	MACRO	HBLK
         9                  ;;	COMPUTE LOG2(HBLK), RETURN @X AS RESULT
        10                  ;;	(2 ** @X = HBLK ON RETURN)
        11                  @Y	SET	HBLK
        12                  @X	SET	0
        13                  ;;	COUNT RIGHT SHIFTS OF @Y UNTIL = 1
        14                  	REPT	8
        15                  	IF	@Y = 1
        16                  	EXITM
        17                  	ENDIF
        18                  ;;	@Y IS NOT 1, SHIFT RIGHT ONE POSITION
        19                  @Y	SET	@Y SHR 1
        20                  @X	SET	@X + 1
        21                  	ENDM
        22                  	ENDM
        23                  ;
        24                  ;*****************************************************
        25                  ;*                                                   *
        26                  ;*         CP/M TO HOST DISK CONSTANTS               *
        27                  ;*                                                   *
        28                  ;*****************************************************
        29   0800 =         BLKSIZ	EQU	2048		;CP/M ALLOCATION SIZE
        30   0200 =         HSTSIZ	EQU	512		;HOST DISK SECTOR SIZE
        31   0014 =         HSTSPT	EQU	20		;HOST DISK SECTORS/TRK
        32   0004 =         HSTBLK	EQU	HSTSIZ/128	;CP/M SECTS/HOST BUFF
        33   0050 =         CPMSPT	EQU	HSTBLK * HSTSPT	;CP/M SECTORS/TRACK
        34   0003 =         SECMSK	EQU	HSTBLK-1	;SECTOR MASK
        35                  	SMASK	HSTBLK		;COMPUTE SECTOR MASK
        36   0002 =         SECSHF	EQU	@X		;LOG2(HSTBLK)
        37                  ;
        38                  ;*****************************************************
        39                  ;*                                                   *
        40                  ;*        BDOS CONSTANTS ON ENTRY TO WRITE           *
        41                  ;*                                                   *
        42                  ;*****************************************************
        43   0000 =         WRALL	EQU	0		;WRITE TO ALLOCATED
        44   0001 =         WRDIR	EQU	1		;WRITE TO DIRECTORY
        45   0002 =         WRUAL	EQU	2		;WRITE TO UNALLOCATED
        46                  ;
        47                  ;*****************************************************
        48                  ;*                                                   *
        49                  ;*	THE BDOS ENTRY POINTS GIVEN BELOW SHOW THE   *
        50                  ;*      CODE WHICH IS RELEVANT TO DEBLOCKING ONLY.   *
        51                  ;*                                                   *
        52                  ;*****************************************************
        53                  ;
        54                  ;	DISKDEF MACRO, OR HAND CODED TABLES GO HERE
        55   0000 =         DPBASE	EQU	$		;DISK PARAM BLOCK BASE
        56                  ;
        65                  HOME:
        66                  	;HOME THE SELECTED DISK
        67                  HOME:
        68   0008 3A6B01    	LDA	HSTWRT	;CHECK FOR PENDING WRITE
        69   000B B7        	ORA	A
        70   000C C21200    	JNZ	HOMED
        71   000F 326A01    	STA	HSTACT	;CLEAR HOST ACTIVE FLAG
        72                  HOMED:
        73   0012 C9        	RET
        74                  ;
        75                  SELDSK:
        76                  	;SELECT DISK
        77   0013 79        	MOV	A,C		;SELECTED DISK NUMBER
        78   0014 326101    	STA	SEKDSK		;SEEK DISK NUMBER
        79   0017 6F        	MOV	L,A		;DISK NUMBER TO HL
        80   0018 2600      	MVI	H,0
        81                  	REPT	4		;MULTIPLY BY 16
        82                  	DAD	H
        83                  	ENDM
        84   001A+29        	DAD	H
        85   001B+29        	DAD	H
        86   001C+29        	DAD	H
        87   001D+29        	DAD	H
        88   001E 110000    	LXI	D,DPBASE	;BASE OF PARM BLOCK
        89   0021 19        	DAD	D		;HL=.DPB(CURDSK)
        90   0022 C9        	RET
        91                  ;
        92                  SETTRK:
        93                  	;SET TRACK GIVEN BY REGISTERS BC
        94   0023 60        	MOV	H,B
        95   0024 69        	MOV	L,C
        96   0025 226201    	SHLD	SEKTRK		;TRACK TO SEEK
        97   0028 C9        	RET
        98                  ;
        99                  SETSEC:
       100                  	;SET SECTOR GIVEN BY REGISTER C
       101   0029 79        	MOV	A,C
       102   002A 326401    	STA	SEKSEC		;SECTOR TO SEEK
       103   002D C9        	RET
       104                  ;
       105                  SETDMA:
       106                  	;SET DMA ADDRESS GIVEN BY BC
       107   002E 60        	MOV	H,B
       108   002F 69        	MOV	L,C
       109   0030 227501    	SHLD	DMAADR
       110   0033 C9        	RET
       111                  ;
       112                  SECTRAN:
       113                  	;TRANSLATE SECTOR NUMBER BC
       114   0034 60        	MOV	H,B
       115   0035 69        	MOV	L,C
       116   0036 C9        	RET
       117                  ;
       118                  ;*****************************************************
       119                  ;*                                                   *
       120                  ;*	THE READ ENTRY POINT TAKES THE PLACE OF      *
       121                  ;*	THE PREVIOUS BIOS DEFINTION FOR READ.        *
       122                  ;*                                                   *
       123                  ;*****************************************************
       124                  READ:
       125                  	;READ THE SELECTED CP/M SECTOR
       126   0037 AF        	XRA	A
       127   0038 326C01    	STA	UNACNT
       128   003B 3E01      	MVI	A,1
       129   003D 327301    	STA	READOP		;READ OPERATION
       130   0040 327201    	STA	RSFLAG		;MUST READ DATA
       131   0043 3E02      	MVI	A,WRUAL
       132   0045 327401    	STA	WRTYPE		;TREAT AS UNALLOC
       133   0048 C3B600    	JMP	RWOPER		;TO PERFORM THE READ
       134                  ;
       135                  ;*****************************************************
       136                  ;*                                                   *
       137                  ;*	THE WRITE ENTRY POINT TAKES THE PLACE OF     *
       138                  ;*	THE PREVIOUS BIOS DEFINTION FOR WRITE.       *
       139                  ;*                                                   *
       140                  ;*****************************************************
       141                  WRITE:
       142                  	;WRITE THE SELECTED CP/M SECTOR
       143   004B AF        	XRA	A		;0 TO ACCUMULATOR
       144   004C 327301    	STA	READOP		;NOT A READ OPERATION
       145   004F 79        	MOV	A,C		;WRITE TYPE IN C
       146   0050 327401    	STA	WRTYPE
       147   0053 FE02      	CPI	WRUAL		;WRITE UNALLOCATED?
       148   0055 C26F00    	JNZ	CHKUNA		;CHECK FOR UNALLOC
       149                  ;
       150                  ;	WRITE TO UNALLOCATED, SET PARAMETERS
       151   0058 3E10      	MVI	A,BLKSIZ/128	;NEXT UNALLOC RECS
       152   005A 326C01    	STA	UNACNT
       153   005D 3A6101    	LDA	SEKDSK		;DISK TO SEEK
       154   0060 326D01    	STA	UNADSK		;UNADSK = SEKDSK
       155   0063 2A6201    	LHLD	SEKTRK
       156   0066 226E01    	SHLD	UNATRK		;UNATRK = SECTRK
       157   0069 3A6401    	LDA	SEKSEC
       158   006C 327001    	STA	UNASEC		;UNASEC = SEKSEC
       159                  ;
       160                  CHKUNA:
       161                  	;CHECK FOR WRITE TO UNALLOCATED SECTOR
       162   006F 3A6C01    	LDA	UNACNT		;ANY UNALLOC REMAIN?
       163   0072 B7        	ORA	A
       164   0073 CAAE00    	JZ	ALLOC		;SKIP IF NOT
       165                  ;
       166                  ;	MORE UNALLOCATED RECORDS REMAIN
       167   0076 3D        	DCR	A		;UNACNT = UNACNT-1
       168   0077 326C01    	STA	UNACNT
       169   007A 3A6101    	LDA	SEKDSK		;SAME DISK?
       170   007D 216D01    	LXI	H,UNADSK
       171   0080 BE        	CMP	M		;SEKDSK = UNADSK?
       172   0081 C2AE00    	JNZ	ALLOC		;SKIP IF NOT
       173                  ;
       174                  ;	DISKS ARE THE SAME
       175   0084 216E01    	LXI	H,UNATRK
       176   0087 CD5301    	CALL	SEKTRKCMP	;SEKTRK = UNATRK?
       177   008A C2AE00    	JNZ	ALLOC		;SKIP IF NOT
       178                  ;
       179                  ;	TRACKS ARE THE SAME
       180   008D 3A6401    	LDA	SEKSEC		;SAME SECTOR?
       181   0090 217001    	LXI	H,UNASEC
       182   0093 BE        	CMP	M		;SEKSEC = UNASEC?
       183   0094 C2AE00    	JNZ	ALLOC		;SKIP IF NOT
       184                  ;
       185                  ;	MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF
       186   0097 34        	INR	M		;UNASEC = UNASEC+1
       187   0098 7E        	MOV	A,M		;END OF TRACK?
       188   0099 FE50      	CPI	CPMSPT		;COUNT CP/M SECTORS
       189   009B DAA700    	JC	NOOVF		;SKIP IF NO OVERFLOW
       190                  ;
       191                  ;	OVERFLOW TO NEXT TRACK
       192   009E 3600      	MVI	M,0		;UNASEC = 0
       193   00A0 2A6E01    	LHLD	UNATRK
       194   00A3 23        	INX	H
       195   00A4 226E01    	SHLD	UNATRK		;UNATRK = UNATRK+1
       196                  ;
       197                  NOOVF:
       198                  	;MATCH FOUND, MARK AS UNNECESSARY READ
       199   00A7 AF        	XRA	A		;0 TO ACCUMULATOR
       200   00A8 327201    	STA	RSFLAG		;RSFLAG = 0
       201   00AB C3B600    	JMP	RWOPER		;TO PERFORM THE WRITE
       202                  ;
       203                  ALLOC:
       204                  	;NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ
       205   00AE AF        	XRA	A		;0 TO ACCUM
       206   00AF 326C01    	STA	UNACNT		;UNACNT = 0
       207   00B2 3C        	INR	A		;1 TO ACCUM
       208   00B3 327201    	STA	RSFLAG		;RSFLAG = 1
       209                  ;
       210                  ;*****************************************************
       211                  ;*                                                   *
       212                  ;*	COMMON CODE FOR READ AND WRITE FOLLOWS       *
       213                  ;*                                                   *
       214                  ;*****************************************************
       215                  RWOPER:
       216                  	;ENTER HERE TO PERFORM THE READ/WRITE
       217   00B6 AF        	XRA	A		;ZERO TO ACCUM
       218   00B7 327101    	STA	ERFLAG		;NO ERRORS (YET)
       219   00BA 3A6401    	LDA	SEKSEC		;COMPUTE HOST SECTOR
       220                  	REPT	SECSHF
       221                  	ORA	A		;CARRY = 0
       222                  	RAR			;SHIFT RIGHT
       223                  	ENDM
       224   00BD+B7        	ORA	A		;CARRY = 0
       225   00BE+1F        	RAR			;SHIFT RIGHT
       226   00BF+B7        	ORA	A		;CARRY = 0
       227   00C0+1F        	RAR			;SHIFT RIGHT
       228   00C1 326901    	STA	SEKHST		;HOST SECTOR TO SEEK
       229                  ;
       230                  ;	ACTIVE HOST SECTOR?
       231   00C4 216A01    	LXI	H,HSTACT	;HOST ACTIVE FLAG
       232   00C7 7E        	MOV	A,M
       233   00C8 3601      	MVI	M,1		;ALWAYS BECOMES 1
       234   00CA B7        	ORA	A		;WAS IT ALREADY?
       235   00CB CAF200    	JZ	FILHST		;FILL HOST IF NOT
       236                  ;
       237                  ;	HOST BUFFER ACTIVE, SAME AS SEEK BUFFER?
       238   00CE 3A6101    	LDA	SEKDSK
       239   00D1 216501    	LXI	H,HSTDSK	;SAME DISK?
       240   00D4 BE        	CMP	M		;SEKDSK = HSTDSK?
       241   00D5 C2EB00    	JNZ	NOMATCH
       242                  ;
       243                  ;	SAME DISK, SAME TRACK?
       244   00D8 216601    	LXI	H,HSTTRK
       245   00DB CD5301    	CALL	SEKTRKCMP	;SEKTRK = HSTTRK?
       246   00DE C2EB00    	JNZ	NOMATCH
       247                  ;
       248                  ;	SAME DISK, SAME TRACK, SAME BUFFER?
       249   00E1 3A6901    	LDA	SEKHST
       250   00E4 216801    	LXI	H,HSTSEC	;SEKHST = HSTSEC?
       251   00E7 BE        	CMP	M
       252   00E8 CA0F01    	JZ	MATCH		;SKIP IF MATCH
       253                  ;
       254                  NOMATCH:
       255                  	;PROPER DISK, BUT NOT CORRECT SECTOR
       256   00EB 3A6B01    	LDA	HSTWRT		;HOST WRITTEN?
       257   00EE B7        	ORA	A
       258   00EF C45F01    	CNZ	WRITEHST	;CLEAR HOST BUFF
       259                  ;
       260                  FILHST:
       261                  	;MAY HAVE TO FILL THE HOST BUFFER
       262   00F2 3A6101    	LDA	SEKDSK
       263   00F5 326501    	STA	HSTDSK
       264   00F8 2A6201    	LHLD	SEKTRK
       265   00FB 226601    	SHLD	HSTTRK
       266   00FE 3A6901    	LDA	SEKHST
       267   0101 326801    	STA	HSTSEC
       268   0104 3A7201    	LDA	RSFLAG		;NEED TO READ?
       269   0107 B7        	ORA	A
       270   0108 C46001    	CNZ	READHST		;YES, IF 1
       271   010B AF        	XRA	A		;0 TO ACCUM
       272   010C 326B01    	STA	HSTWRT		;NO PENDING WRITE
       273                  ;
       274                  MATCH:
       275                  	;COPY DATA TO OR FROM BUFFER
       276   010F 3A6401    	LDA	SEKSEC		;MASK BUFFER NUMBER
       277   0112 E603      	ANI	SECMSK		;LEAST SIGNIF BITS
       278   0114 6F        	MOV	L,A		;READY TO SHIFT
       279   0115 2600      	MVI	H,0		;DOUBLE COUNT
       280                  	REPT	7		;SHIFT LEFT 7
       281                  	DAD	H
       282                  	ENDM
       283   0117+29        	DAD	H
       284   0118+29        	DAD	H
       285   0119+29        	DAD	H
       286   011A+29        	DAD	H
       287   011B+29        	DAD	H
       288   011C+29        	DAD	H
       289   011D+29        	DAD	H
       290                  ;	HL HAS RELATIVE HOST BUFFER ADDRESS
       291   011E 117701    	LXI	D,HSTBUF
       292   0121 19        	DAD	D		;HL = HOST ADDRESS
       293   0122 EB        	XCHG			;NOW IN DE
       294   0123 2A7501    	LHLD	DMAADR		;GET/PUT CP/M DATA
       295   0126 0E80      	MVI	C,128		;LENGTH OF MOVE
       296   0128 3A7301    	LDA	READOP		;WHICH WAY?
       297   012B B7        	ORA	A
       298   012C C23501    	JNZ	RWMOVE		;SKIP IF READ
       299                  ;
       300                  ;	WRITE OPERATION, MARK AND SWITCH DIRECTION
       301   012F 3E01      	MVI	A,1
       302   0131 326B01    	STA	HSTWRT		;HSTWRT = 1
       303   0134 EB        	XCHG			;SOURCE/DEST SWAP
       304                  ;
       305                  RWMOVE:
       306                  	;C INITIALLY 128, DE IS SOURCE, HL IS DEST
       307   0135 1A        	LDAX	D		;SOURCE CHARACTER
       308   0136 13        	INX	D
       309   0137 77        	MOV	M,A		;TO DEST
       310   0138 23        	INX	H
       311   0139 0D        	DCR	C		;LOOP 128 TIMES
       312   013A C23501    	JNZ	RWMOVE
       313                  ;
       314                  ;	DATA HAS BEEN MOVED TO/FROM HOST BUFFER
       315   013D 3A7401    	LDA	WRTYPE		;WRITE TYPE
       316   0140 FE01      	CPI	WRDIR		;TO DIRECTORY?
       317   0142 3A7101    	LDA	ERFLAG		;IN CASE OF ERRORS
       318   0145 C0        	RNZ			;NO FURTHER PROCESSING
       319                  ;
       320                  ;	CLEAR HOST BUFFER FOR DIRECTORY WRITE
       321   0146 B7        	ORA	A		;ERRORS?
       322   0147 C0        	RNZ			;SKIP IF SO
       323   0148 AF        	XRA	A		;0 TO ACCUM
       324   0149 326B01    	STA	HSTWRT		;BUFFER WRITTEN
       325   014C CD5F01    	CALL	WRITEHST
       326   014F 3A7101    	LDA	ERFLAG
       327   0152 C9        	RET
       328                  ;
       329                  ;*****************************************************
       330                  ;*                                                   *
       331                  ;*	UTILITY SUBROUTINE FOR 16-BIT COMPARE        *
       332                  ;*                                                   *
       333                  ;*****************************************************
       334                  SEKTRKCMP:
       335                  	;HL = .UNATRK OR .HSTTRK, COMPARE WITH SEKTRK
       336   0153 EB        	XCHG
       337   0154 216201    	LXI	H,SEKTRK
       338   0157 1A        	LDAX	D		;LOW BYTE COMPARE
       339   0158 BE        	CMP	M		;SAME?
       340   0159 C0        	RNZ			;RETURN IF NOT
       341                  ;	LOW BYTES EQUAL, TEST HIGH 1S
       342   015A 13        	INX	D
       343   015B 23        	INX	H
       344   015C 1A        	LDAX	D
       345   015D BE        	CMP	M	;SETS FLAGS
       346   015E C9        	RET
       347                  ;
       348                  ;*****************************************************
       349                  ;*                                                   *
       350                  ;*	WRITEHST PERFORMS THE PHYSICAL WRITE TO      *
       351                  ;*	THE HOST DISK, READHST READS THE PHYSICAL    *
       352                  ;*	DISK.					     *
       353                  ;*                                                   *
       354                  ;*****************************************************
       355                  WRITEHST:
       356                  	;HSTDSK = HOST DISK #, HSTTRK = HOST TRACK #,
       357                  	;HSTSEC = HOST SECT #. WRITE "HSTSIZ" BYTES
       358                  	;FROM HSTBUF AND RETURN ERROR FLAG IN ERFLAG.
       359                  	;RETURN ERFLAG NON-ZERO IF ERROR
       360   015F C9        	RET
       361                  ;
       362                  READHST:
       363                  	;HSTDSK = HOST DISK #, HSTTRK = HOST TRACK #,
       364                  	;HSTSEC = HOST SECT #. READ "HSTSIZ" BYTES
       365                  	;INTO HSTBUF AND RETURN ERROR FLAG IN ERFLAG.
       366   0160 C9        	RET
       367                  ;
       368                  ;*****************************************************
       369                  ;*                                                   *
       370                  ;*	UNITIALIZED RAM DATA AREAS		     *
       371                  ;*                                                   *
       372                  ;*****************************************************
       373                  ;
       374   0161           SEKDSK:	DS	1		;SEEK DISK NUMBER
       375   0162           SEKTRK:	DS	2		;SEEK TRACK NUMBER
       376   0164           SEKSEC:	DS	1		;SEEK SECTOR NUMBER
       377                  ;
       378   0165           HSTDSK:	DS	1		;HOST DISK NUMBER
       379   0166           HSTTRK:	DS	2		;HOST TRACK NUMBER
       380   0168           HSTSEC:	DS	1		;HOST SECTOR NUMBER
       381                  ;
       382   0169           SEKHST:	DS	1		;SEEK SHR SECSHF
       383   016A           HSTACT:	DS	1		;HOST ACTIVE FLAG
       384   016B           HSTWRT:	DS	1		;HOST WRITTEN FLAG
       385                  ;
       386   016C           UNACNT:	DS	1		;UNALLOC REC CNT
       387   016D           UNADSK:	DS	1		;LAST UNALLOC DISK
       388   016E           UNATRK:	DS	2		;LAST UNALLOC TRACK
       389   0170           UNASEC:	DS	1		;LAST UNALLOC SECTOR
       390                  ;
       391   0171           ERFLAG:	DS	1		;ERROR REPORTING
       392   0172           RSFLAG:	DS	1		;READ SECTOR FLAG
       393   0173           READOP:	DS	1		;1 IF READ OPERATION
       394   0174           WRTYPE:	DS	1		;WRITE OPERATION TYPE
       395   0175           DMAADR:	DS	2		;LAST DMA ADDRESS
       396   0177           HSTBUF:	DS	HSTSIZ		;HOST BUFFER
       397                  ;
       398                  ;*****************************************************
       399                  ;*                                                   *
       400                  ;*	THE ENDEF MACRO INVOCATION GOES HERE	     *
       401                  ;*                                                   *
       402                  ;*****************************************************
       403   0377           	END
    ALLOC            00AE   164   172   177   183   203#
    BLKSIZ           0800    29#  151
    BOOT             0000    57#
    CHKUNA           006F   148   160#
    CPMSPT           0050    33#  188
    DMAADR           0175   109   294   395#
    DPBASE           0000    55#   88
    ERFLAG           0171   218   317   326   391#
    FILHST           00F2   235   260#
    HOME             0008    65#   67#
    HOMED            0012    70    72#
    HSTACT           016A    61    71   231   383#
    HSTBLK           0004    32#   33    34    35
    HSTBUF           0177   291   396#
    HSTDSK           0165   239   263   378#
    HSTSEC           0168   250   267   380#
    HSTSIZ           0200    30#   32   396
    HSTSPT           0014    31#   33
    HSTTRK           0166   244   265   379#
    HSTWRT           016B    68   256   272   302   324   384#
    MATCH            010F   252   274#
    NOMATCH          00EB   241   246   254#
    NOOVF            00A7   189   197#
    READ             0037   124#
    READHST          0160   270   362#
    READOP           0173   129   144   296   393#
    RSFLAG           0172   130   200   208   268   392#
    RWMOVE           0135   298   305#  312
    RWOPER           00B6   133   201   215#
    SECMSK           0003    34#  277
    SECSHF           0002    36#  220
    SECTRAN          0034   112#
    SEKDSK           0161    78   153   169   238   262   374#
    SEKHST           0169   228   249   266   382#
    SEKSEC           0164   102   157   180   219   276   376#
    SEKTRK           0162    96   155   264   337   375#
    SEKTRKCMP        0153   176   245   334#
    SELDSK           0013    75#
    SETDMA           002E   105#
    SETSEC           0029    99#
    SETTRK           0023    92#
    UNACNT           016C    62   127   152   162   168   206   386#
    UNADSK           016D   154   170   387#
    UNASEC           0170   158   181   389#
    UNATRK           016E   156   175   193   195   388#
    WBOOT            0000    58#
    WRALL            0000    43#
    WRDIR            0001    44#  316
    WRITE            004B   141#
    WRITEHST         015F   258   325   355#
    WRTYPE           0174   132   146   315   394#
    WRUAL            0002    45#  131   147

Back to title page Next